{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%reload_ext autoreload\n",
    "%autoreload 2\n",
    "%matplotlib inline\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "import sys\n",
    "sys.path.append('..')\n",
    "\n",
    "# load my own module\n",
    "from helper import logistic_regression as lr  \n",
    "from helper import general as general\n",
    "\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>test1</th>\n",
       "      <th>test2</th>\n",
       "      <th>accepted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.092742</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.213710</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.375000</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-0.513250</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      test1    test2  accepted\n",
       "0  0.051267  0.69956         1\n",
       "1 -0.092742  0.68494         1\n",
       "2 -0.213710  0.69225         1\n",
       "3 -0.375000  0.50219         1\n",
       "4 -0.513250  0.46564         1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = pd.read_csv('ex2data2.txt', names=['test1', 'test2', 'accepted'])\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# visualize data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.text.Text at 0x112b06550>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n8PX1rfB1/vjjDyxYsACPHj2Cg4MDWrRogZycHFy5cgWRkZE4f/681rPnKyMuLg7x8fEAgA4dOqjs\nk8vlWLBgAQ4cOABBEFCvXj20bt0aKSkpOHToEI4cOYL3338f48aNUzmvKvdf0++Gru2ZO3cujh07\nBkEQ0LRpU7i6uuLWrVs4fvw4QkNDMWPGDMyePVs6/vLly5g0aRIeP34s/X0pLCxEXFwcoqOjERIS\ngp07d5aZUKjuPYWHh2P27NnIyclBzZo10bJlSxQVFSEuLg4xMTHYs2cP1q5dWyYwFAQBaWlpGDZs\nGDIzM9G4cWP4+PggNjYWhw4dwp9//omtW7eidevWmn68RPohEhmAr6+vKJPJxN9++63cYwoKCsSN\nGzeKbdq0EWUymfjRRx+p7H/06JHYt29fUSaTiTNnzhQzMjKkfXfv3hXffPNN0dfXV+zfv79YUFAg\n7YuPjxf9/PxEmUwmfv/992JRUZEoiqIol8vFtWvXijKZTGpfWlqadN7ChQtFX19f8d1331Xb3r17\n94q+vr5ir169VLa/9tprokwmE1esWCFte/jwodilSxdRJpOJixcvFh8/fizty8/PF5csWSK1IT4+\nXtp37tw50dfXV/T19RX79esnZmZmSvdC+R579uwpymQycdeuXeXeWyW5XC5OmTJF9PX1FYcMGSLm\n5eVJ+7Zt2yb6+vqK/v7+4oEDB1TOO3TokNi+fXtRJpOJu3fvVtn3wQcfiL6+vmLPnj3F6OhoafvN\nmzfFwYMHS++rvPuojvLejx8/XutzRFEUFy9eLPr6+oodO3YUjx07Jm1XKBTir7/+Kn0OfvnlF5Xz\nXn31VdHX11ccNWqUymfgypUr4gsvvCC9h5UrV0r7lD8bmUwmyuVy6XUCAgJEmUwmBgcHiwqFQjr+\n+vXrYteuXUWZTCb+/PPPat/vk/coNTVVeo3k5GRpe3JysvTzWLRokZiTkyPtO336tNiuXTtRJpOJ\nO3fu1Oq+aXu/L126JPbr10/09fUVu3XrJj548EBl/7fffit9Fs6cOSNtVygU4pYtW0Q/Pz+xdevW\n4tmzZ1XOq8r91/S7oUt7Tp06Jfr6+orPPfecGBcXp3LO2rVrRV9fX9HPz0+8c+eOtG/UqFGiTCYT\nv/zyS7GwsFDanpKSIvbr10+UyWTiJ598ovKele+p9GunpaWJHTp0EGUymfjWW2+JWVlZKtdS3qee\n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\ncnJypYLJHTt2YNWqVeXud3V11UfziIiIiIyOwWQpDx48QEJCAurWrYtmzZqV2a9ceePJ2mcVGT16\nNHr16qXIlNDzAAAgAElEQVR23/Tp02FjY3XzoIiIiKiaYDBZSnh4OObNm4cePXqUKSskiiIuXboE\nQRDw1FNPVeq6bm5ucHNzU7uvZs2aOreXiIiIyNTYJVbK888/DxcXF5w+fRpnz55V2bdq1SrEx8ej\nb9++lVqekYiIiMiaVdueyZiYGISGhqJJkyYYPnw4AMDZ2RmLFy/Gu+++iylTpqBv375wd3fH5cuX\nERkZCR8fH3zyyScmbjkRERGR+agWwaS6Mj7R0dEICgqCv7+/FEwCwMCBA9GkSRP89NNPCA8PR35+\nPtzd3fHmm29i6tSpcHJyMmbTiYiIiMya1ZcGMne9e/cGABw/ftzELSEiIiKqPOZMEhEREZHOGEwS\nERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIR\nERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhER\nEZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERER\nkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGR\nzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHO\nGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4Y\nTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhM\nEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc4YTBIRERGRzhhMEhEREZHOGEwS\nERERkc4YTBIRERGRzhhMEhEREZHOGEwSERERkc5qmLoBRGS+5HIFYpLuIzuvAK5O9pB51YGtLb+D\nEhHRvxhMEpFaEVF3cPBMIrLzCqRtrk72eDGgOfz9GpmwZUREZE4YTBJRGRFRd7DtWEyZ7dl5BdJ2\n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\nQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112a9f3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.set(context=\"notebook\", style=\"ticks\", font_scale=1.5)\n",
    "\n",
    "sns.lmplot('test1', 'test2', hue='accepted', data=df, \n",
    "           size=6, \n",
    "           fit_reg=False, \n",
    "           scatter_kws={\"s\": 50}\n",
    "          )\n",
    "\n",
    "plt.title('Regularized Logistic Regression')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# feature mapping\n",
    "\n",
    "polynomial expansion\n",
    "\n",
    "```\n",
    "for i in 0..i\n",
    "  for p in 0..i:\n",
    "    output x^(i-p) * y^p\n",
    "```\n",
    "<img style=\"float: left;\" src=\"../img/mapped_feature.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "x1 = np.array(df.test1)\n",
    "x2 = np.array(df.test2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(118, 28)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f00</th>\n",
       "      <th>f01</th>\n",
       "      <th>f02</th>\n",
       "      <th>f03</th>\n",
       "      <th>f04</th>\n",
       "      <th>f05</th>\n",
       "      <th>f06</th>\n",
       "      <th>f10</th>\n",
       "      <th>f11</th>\n",
       "      <th>f12</th>\n",
       "      <th>...</th>\n",
       "      <th>f30</th>\n",
       "      <th>f31</th>\n",
       "      <th>f32</th>\n",
       "      <th>f33</th>\n",
       "      <th>f40</th>\n",
       "      <th>f41</th>\n",
       "      <th>f42</th>\n",
       "      <th>f50</th>\n",
       "      <th>f51</th>\n",
       "      <th>f60</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.69956</td>\n",
       "      <td>0.489384</td>\n",
       "      <td>0.342354</td>\n",
       "      <td>0.239497</td>\n",
       "      <td>0.167542</td>\n",
       "      <td>0.117206</td>\n",
       "      <td>0.051267</td>\n",
       "      <td>0.035864</td>\n",
       "      <td>0.025089</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000135</td>\n",
       "      <td>0.000094</td>\n",
       "      <td>0.000066</td>\n",
       "      <td>0.000046</td>\n",
       "      <td>0.000007</td>\n",
       "      <td>0.000005</td>\n",
       "      <td>0.000003</td>\n",
       "      <td>3.541519e-07</td>\n",
       "      <td>2.477505e-07</td>\n",
       "      <td>1.815630e-08</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.68494</td>\n",
       "      <td>0.469143</td>\n",
       "      <td>0.321335</td>\n",
       "      <td>0.220095</td>\n",
       "      <td>0.150752</td>\n",
       "      <td>0.103256</td>\n",
       "      <td>-0.092742</td>\n",
       "      <td>-0.063523</td>\n",
       "      <td>-0.043509</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.000798</td>\n",
       "      <td>-0.000546</td>\n",
       "      <td>-0.000374</td>\n",
       "      <td>-0.000256</td>\n",
       "      <td>0.000074</td>\n",
       "      <td>0.000051</td>\n",
       "      <td>0.000035</td>\n",
       "      <td>-6.860919e-06</td>\n",
       "      <td>-4.699318e-06</td>\n",
       "      <td>6.362953e-07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.69225</td>\n",
       "      <td>0.479210</td>\n",
       "      <td>0.331733</td>\n",
       "      <td>0.229642</td>\n",
       "      <td>0.158970</td>\n",
       "      <td>0.110047</td>\n",
       "      <td>-0.213710</td>\n",
       "      <td>-0.147941</td>\n",
       "      <td>-0.102412</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.009761</td>\n",
       "      <td>-0.006757</td>\n",
       "      <td>-0.004677</td>\n",
       "      <td>-0.003238</td>\n",
       "      <td>0.002086</td>\n",
       "      <td>0.001444</td>\n",
       "      <td>0.001000</td>\n",
       "      <td>-4.457837e-04</td>\n",
       "      <td>-3.085938e-04</td>\n",
       "      <td>9.526844e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.50219</td>\n",
       "      <td>0.252195</td>\n",
       "      <td>0.126650</td>\n",
       "      <td>0.063602</td>\n",
       "      <td>0.031940</td>\n",
       "      <td>0.016040</td>\n",
       "      <td>-0.375000</td>\n",
       "      <td>-0.188321</td>\n",
       "      <td>-0.094573</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.052734</td>\n",
       "      <td>-0.026483</td>\n",
       "      <td>-0.013299</td>\n",
       "      <td>-0.006679</td>\n",
       "      <td>0.019775</td>\n",
       "      <td>0.009931</td>\n",
       "      <td>0.004987</td>\n",
       "      <td>-7.415771e-03</td>\n",
       "      <td>-3.724126e-03</td>\n",
       "      <td>2.780914e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.46564</td>\n",
       "      <td>0.216821</td>\n",
       "      <td>0.100960</td>\n",
       "      <td>0.047011</td>\n",
       "      <td>0.021890</td>\n",
       "      <td>0.010193</td>\n",
       "      <td>-0.513250</td>\n",
       "      <td>-0.238990</td>\n",
       "      <td>-0.111283</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.135203</td>\n",
       "      <td>-0.062956</td>\n",
       "      <td>-0.029315</td>\n",
       "      <td>-0.013650</td>\n",
       "      <td>0.069393</td>\n",
       "      <td>0.032312</td>\n",
       "      <td>0.015046</td>\n",
       "      <td>-3.561597e-02</td>\n",
       "      <td>-1.658422e-02</td>\n",
       "      <td>1.827990e-02</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 28 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   f00      f01       f02       f03       f04       f05       f06       f10  \\\n",
       "0  1.0  0.69956  0.489384  0.342354  0.239497  0.167542  0.117206  0.051267   \n",
       "1  1.0  0.68494  0.469143  0.321335  0.220095  0.150752  0.103256 -0.092742   \n",
       "2  1.0  0.69225  0.479210  0.331733  0.229642  0.158970  0.110047 -0.213710   \n",
       "3  1.0  0.50219  0.252195  0.126650  0.063602  0.031940  0.016040 -0.375000   \n",
       "4  1.0  0.46564  0.216821  0.100960  0.047011  0.021890  0.010193 -0.513250   \n",
       "\n",
       "        f11       f12      ...            f30       f31       f32       f33  \\\n",
       "0  0.035864  0.025089      ...       0.000135  0.000094  0.000066  0.000046   \n",
       "1 -0.063523 -0.043509      ...      -0.000798 -0.000546 -0.000374 -0.000256   \n",
       "2 -0.147941 -0.102412      ...      -0.009761 -0.006757 -0.004677 -0.003238   \n",
       "3 -0.188321 -0.094573      ...      -0.052734 -0.026483 -0.013299 -0.006679   \n",
       "4 -0.238990 -0.111283      ...      -0.135203 -0.062956 -0.029315 -0.013650   \n",
       "\n",
       "        f40       f41       f42           f50           f51           f60  \n",
       "0  0.000007  0.000005  0.000003  3.541519e-07  2.477505e-07  1.815630e-08  \n",
       "1  0.000074  0.000051  0.000035 -6.860919e-06 -4.699318e-06  6.362953e-07  \n",
       "2  0.002086  0.001444  0.001000 -4.457837e-04 -3.085938e-04  9.526844e-05  \n",
       "3  0.019775  0.009931  0.004987 -7.415771e-03 -3.724126e-03  2.780914e-03  \n",
       "4  0.069393  0.032312  0.015046 -3.561597e-02 -1.658422e-02  1.827990e-02  \n",
       "\n",
       "[5 rows x 28 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = lr.feature_mapping(x1, x2, power=6)\n",
    "print(data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>f00</th>\n",
       "      <th>f01</th>\n",
       "      <th>f02</th>\n",
       "      <th>f03</th>\n",
       "      <th>f04</th>\n",
       "      <th>f05</th>\n",
       "      <th>f06</th>\n",
       "      <th>f10</th>\n",
       "      <th>f11</th>\n",
       "      <th>f12</th>\n",
       "      <th>...</th>\n",
       "      <th>f30</th>\n",
       "      <th>f31</th>\n",
       "      <th>f32</th>\n",
       "      <th>f33</th>\n",
       "      <th>f40</th>\n",
       "      <th>f41</th>\n",
       "      <th>f42</th>\n",
       "      <th>f50</th>\n",
       "      <th>f51</th>\n",
       "      <th>f60</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>118.0</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>1.180000e+02</td>\n",
       "      <td>118.000000</td>\n",
       "      <td>1.180000e+02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.183102</td>\n",
       "      <td>0.301370</td>\n",
       "      <td>0.142350</td>\n",
       "      <td>1.710985e-01</td>\n",
       "      <td>0.115710</td>\n",
       "      <td>1.257256e-01</td>\n",
       "      <td>0.054779</td>\n",
       "      <td>-0.025472</td>\n",
       "      <td>0.015483</td>\n",
       "      <td>...</td>\n",
       "      <td>5.983333e-02</td>\n",
       "      <td>-0.005251</td>\n",
       "      <td>9.432094e-03</td>\n",
       "      <td>-0.001705</td>\n",
       "      <td>1.225384e-01</td>\n",
       "      <td>0.011812</td>\n",
       "      <td>1.893340e-02</td>\n",
       "      <td>5.196507e-02</td>\n",
       "      <td>-0.000703</td>\n",
       "      <td>7.837118e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>0.0</td>\n",
       "      <td>0.519743</td>\n",
       "      <td>0.284536</td>\n",
       "      <td>0.326134</td>\n",
       "      <td>2.815658e-01</td>\n",
       "      <td>0.299092</td>\n",
       "      <td>2.964416e-01</td>\n",
       "      <td>0.496654</td>\n",
       "      <td>0.224075</td>\n",
       "      <td>0.150143</td>\n",
       "      <td>...</td>\n",
       "      <td>2.746459e-01</td>\n",
       "      <td>0.096738</td>\n",
       "      <td>5.455787e-02</td>\n",
       "      <td>0.037443</td>\n",
       "      <td>2.092709e-01</td>\n",
       "      <td>0.072274</td>\n",
       "      <td>3.430092e-02</td>\n",
       "      <td>2.148098e-01</td>\n",
       "      <td>0.058271</td>\n",
       "      <td>1.938621e-01</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.769740</td>\n",
       "      <td>0.000026</td>\n",
       "      <td>-0.456071</td>\n",
       "      <td>6.855856e-10</td>\n",
       "      <td>-0.270222</td>\n",
       "      <td>1.795116e-14</td>\n",
       "      <td>-0.830070</td>\n",
       "      <td>-0.484096</td>\n",
       "      <td>-0.483743</td>\n",
       "      <td>...</td>\n",
       "      <td>-5.719317e-01</td>\n",
       "      <td>-0.296854</td>\n",
       "      <td>-1.592528e-01</td>\n",
       "      <td>-0.113448</td>\n",
       "      <td>1.612020e-09</td>\n",
       "      <td>-0.246068</td>\n",
       "      <td>2.577297e-10</td>\n",
       "      <td>-3.940702e-01</td>\n",
       "      <td>-0.203971</td>\n",
       "      <td>6.472253e-14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-0.254385</td>\n",
       "      <td>0.061086</td>\n",
       "      <td>-0.016492</td>\n",
       "      <td>3.741593e-03</td>\n",
       "      <td>-0.001072</td>\n",
       "      <td>2.298277e-04</td>\n",
       "      <td>-0.372120</td>\n",
       "      <td>-0.178209</td>\n",
       "      <td>-0.042980</td>\n",
       "      <td>...</td>\n",
       "      <td>-5.155632e-02</td>\n",
       "      <td>-0.029360</td>\n",
       "      <td>-3.659760e-03</td>\n",
       "      <td>-0.005749</td>\n",
       "      <td>1.869975e-03</td>\n",
       "      <td>-0.001926</td>\n",
       "      <td>1.258285e-04</td>\n",
       "      <td>-7.147973e-03</td>\n",
       "      <td>-0.006381</td>\n",
       "      <td>8.086369e-05</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.213455</td>\n",
       "      <td>0.252195</td>\n",
       "      <td>0.009734</td>\n",
       "      <td>6.360222e-02</td>\n",
       "      <td>0.000444</td>\n",
       "      <td>1.604015e-02</td>\n",
       "      <td>-0.006336</td>\n",
       "      <td>-0.016521</td>\n",
       "      <td>-0.000039</td>\n",
       "      <td>...</td>\n",
       "      <td>-2.544062e-07</td>\n",
       "      <td>-0.000512</td>\n",
       "      <td>-1.473547e-07</td>\n",
       "      <td>-0.000005</td>\n",
       "      <td>2.736163e-02</td>\n",
       "      <td>0.000205</td>\n",
       "      <td>3.387050e-03</td>\n",
       "      <td>-1.021440e-11</td>\n",
       "      <td>-0.000004</td>\n",
       "      <td>4.527344e-03</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>1.0</td>\n",
       "      <td>0.646562</td>\n",
       "      <td>0.464189</td>\n",
       "      <td>0.270310</td>\n",
       "      <td>2.155453e-01</td>\n",
       "      <td>0.113020</td>\n",
       "      <td>1.001215e-01</td>\n",
       "      <td>0.478970</td>\n",
       "      <td>0.100795</td>\n",
       "      <td>0.079510</td>\n",
       "      <td>...</td>\n",
       "      <td>1.099616e-01</td>\n",
       "      <td>0.015050</td>\n",
       "      <td>1.370560e-02</td>\n",
       "      <td>0.001024</td>\n",
       "      <td>1.520801e-01</td>\n",
       "      <td>0.019183</td>\n",
       "      <td>2.090875e-02</td>\n",
       "      <td>2.526861e-02</td>\n",
       "      <td>0.002104</td>\n",
       "      <td>5.932959e-02</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1.108900</td>\n",
       "      <td>1.229659</td>\n",
       "      <td>1.363569</td>\n",
       "      <td>1.512062e+00</td>\n",
       "      <td>1.676725</td>\n",
       "      <td>1.859321e+00</td>\n",
       "      <td>1.070900</td>\n",
       "      <td>0.568307</td>\n",
       "      <td>0.505577</td>\n",
       "      <td>...</td>\n",
       "      <td>1.228137e+00</td>\n",
       "      <td>0.369805</td>\n",
       "      <td>2.451845e-01</td>\n",
       "      <td>0.183548</td>\n",
       "      <td>1.315212e+00</td>\n",
       "      <td>0.304409</td>\n",
       "      <td>2.018260e-01</td>\n",
       "      <td>1.408460e+00</td>\n",
       "      <td>0.250577</td>\n",
       "      <td>1.508320e+00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>8 rows × 28 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         f00         f01         f02         f03           f04         f05  \\\n",
       "count  118.0  118.000000  118.000000  118.000000  1.180000e+02  118.000000   \n",
       "mean     1.0    0.183102    0.301370    0.142350  1.710985e-01    0.115710   \n",
       "std      0.0    0.519743    0.284536    0.326134  2.815658e-01    0.299092   \n",
       "min      1.0   -0.769740    0.000026   -0.456071  6.855856e-10   -0.270222   \n",
       "25%      1.0   -0.254385    0.061086   -0.016492  3.741593e-03   -0.001072   \n",
       "50%      1.0    0.213455    0.252195    0.009734  6.360222e-02    0.000444   \n",
       "75%      1.0    0.646562    0.464189    0.270310  2.155453e-01    0.113020   \n",
       "max      1.0    1.108900    1.229659    1.363569  1.512062e+00    1.676725   \n",
       "\n",
       "                f06         f10         f11         f12      ...       \\\n",
       "count  1.180000e+02  118.000000  118.000000  118.000000      ...        \n",
       "mean   1.257256e-01    0.054779   -0.025472    0.015483      ...        \n",
       "std    2.964416e-01    0.496654    0.224075    0.150143      ...        \n",
       "min    1.795116e-14   -0.830070   -0.484096   -0.483743      ...        \n",
       "25%    2.298277e-04   -0.372120   -0.178209   -0.042980      ...        \n",
       "50%    1.604015e-02   -0.006336   -0.016521   -0.000039      ...        \n",
       "75%    1.001215e-01    0.478970    0.100795    0.079510      ...        \n",
       "max    1.859321e+00    1.070900    0.568307    0.505577      ...        \n",
       "\n",
       "                f30         f31           f32         f33           f40  \\\n",
       "count  1.180000e+02  118.000000  1.180000e+02  118.000000  1.180000e+02   \n",
       "mean   5.983333e-02   -0.005251  9.432094e-03   -0.001705  1.225384e-01   \n",
       "std    2.746459e-01    0.096738  5.455787e-02    0.037443  2.092709e-01   \n",
       "min   -5.719317e-01   -0.296854 -1.592528e-01   -0.113448  1.612020e-09   \n",
       "25%   -5.155632e-02   -0.029360 -3.659760e-03   -0.005749  1.869975e-03   \n",
       "50%   -2.544062e-07   -0.000512 -1.473547e-07   -0.000005  2.736163e-02   \n",
       "75%    1.099616e-01    0.015050  1.370560e-02    0.001024  1.520801e-01   \n",
       "max    1.228137e+00    0.369805  2.451845e-01    0.183548  1.315212e+00   \n",
       "\n",
       "              f41           f42           f50         f51           f60  \n",
       "count  118.000000  1.180000e+02  1.180000e+02  118.000000  1.180000e+02  \n",
       "mean     0.011812  1.893340e-02  5.196507e-02   -0.000703  7.837118e-02  \n",
       "std      0.072274  3.430092e-02  2.148098e-01    0.058271  1.938621e-01  \n",
       "min     -0.246068  2.577297e-10 -3.940702e-01   -0.203971  6.472253e-14  \n",
       "25%     -0.001926  1.258285e-04 -7.147973e-03   -0.006381  8.086369e-05  \n",
       "50%      0.000205  3.387050e-03 -1.021440e-11   -0.000004  4.527344e-03  \n",
       "75%      0.019183  2.090875e-02  2.526861e-02    0.002104  5.932959e-02  \n",
       "max      0.304409  2.018260e-01  1.408460e+00    0.250577  1.508320e+00  \n",
       "\n",
       "[8 rows x 28 columns]"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.describe()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# regularized cost\n",
    "<img style=\"float: left;\" src=\"../img/reg_cost.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(118, 28)\n",
      "(118,)\n"
     ]
    }
   ],
   "source": [
    "theta = np.zeros(data.shape[1])\n",
    "X = lr.feature_mapping(x1, x2, power=6, as_ndarray=True)\n",
    "print(X.shape)\n",
    "\n",
    "y = general.get_y(df)\n",
    "print(y.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6931471805599454"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr.regularized_cost(theta, X, y, l=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "this is the same as the not regularized cost because we init theta as zeros..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# regularized gradient\n",
    "<img style=\"float: left;\" src=\"../img/reg_gradient.png\">"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  8.47457627e-03,   7.77711864e-05,   3.76648474e-02,\n",
       "         2.34764889e-02,   3.93028171e-02,   3.10079849e-02,\n",
       "         3.87936363e-02,   1.87880932e-02,   1.15013308e-02,\n",
       "         8.19244468e-03,   3.09593720e-03,   4.47629067e-03,\n",
       "         1.37646175e-03,   5.03446395e-02,   7.32393391e-03,\n",
       "         1.28600503e-02,   5.83822078e-03,   7.26504316e-03,\n",
       "         1.83559872e-02,   2.23923907e-03,   3.38643902e-03,\n",
       "         4.08503006e-04,   3.93486234e-02,   4.32983232e-03,\n",
       "         6.31570797e-03,   1.99707467e-02,   1.09740238e-03,\n",
       "         3.10312442e-02])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr.regularized_gradient(theta, X, y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# fit the parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import scipy.optimize as opt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "init cost = 0.6931471805599454\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "     fun: 0.5290027297128078\n",
       "     jac: array([  4.06128511e-08,   1.23248926e-07,   1.11843754e-08,\n",
       "         2.42932377e-08,  -2.79008988e-08,  -3.09799070e-09,\n",
       "        -2.42314243e-08,   2.69894799e-09,   4.99531979e-09,\n",
       "         1.11260284e-08,   4.16159464e-09,   7.62164605e-09,\n",
       "        -1.68354246e-09,   6.26958161e-08,   3.05249450e-08,\n",
       "        -2.54014292e-08,  -5.60465192e-10,  -1.10145308e-08,\n",
       "         1.94433568e-08,  -5.76281431e-09,  -9.77792596e-09,\n",
       "        -5.71315881e-09,  -1.45360581e-09,   1.83952843e-08,\n",
       "        -1.09054922e-08,   9.29674104e-09,   1.01398558e-09,\n",
       "        -5.76833648e-09])\n",
       " message: 'Optimization terminated successfully.'\n",
       "    nfev: 7\n",
       "    nhev: 0\n",
       "     nit: 6\n",
       "    njev: 66\n",
       "  status: 0\n",
       " success: True\n",
       "       x: array([ 1.27273957,  1.1810885 , -1.43166317, -0.17513102, -1.19281777,\n",
       "       -0.45635784, -0.9246532 ,  0.62527151, -0.91742437, -0.35723861,\n",
       "       -0.27470664, -0.29537756, -0.14388751, -2.01995872, -0.36553412,\n",
       "       -0.61555763, -0.27778518, -0.32738059,  0.12400726, -0.0509899 ,\n",
       "       -0.04473156,  0.01556616, -1.4581583 , -0.20600548, -0.29243246,\n",
       "       -0.24218806,  0.0277716 , -1.04320402])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print('init cost = {}'.format(lr.regularized_cost(theta, X, y)))\n",
    "\n",
    "res = opt.minimize(fun=lr.regularized_cost, x0=theta, args=(X, y), method='Newton-CG', jac=lr.regularized_gradient)\n",
    "res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.90      0.75      0.82        60\n",
      "          1       0.78      0.91      0.84        58\n",
      "\n",
      "avg / total       0.84      0.83      0.83       118\n",
      "\n"
     ]
    }
   ],
   "source": [
    "final_theta = res.x\n",
    "y_pred = lr.predict(X, final_theta)\n",
    "\n",
    "print(classification_report(y, y_pred))"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:tf]",
   "language": "python",
   "name": "conda-env-tf-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
